import axios from 'axios'
import store from '@/store'
import router from '@/router'
import { Toast } from 'vant'
import JSONBig from 'json-bigint'

// 创建一个新的axios实例
const baseURL = 'http://toutiao-app.itheima.net'

const request = axios.create({
  // baseURL: 'http://localhost:8000',
  baseURL,
  timeout: 5000,
  transformResponse: [
    function(data) {
      try {
        return JSONBig.parse(data)
      } catch {
        return data
      }
    }
  ]
})

// 添加请求拦截器
request.interceptors.request.use(function (config) {
  // 在发送请求之前添加token，没有token就不让发请求
  const token = store.state.user.token.token
  if (token) {
    config.headers.Authorization = 'Bearer ' + token
  }
  return config
}, function (error) {
  // 对请求错误做些什么
  return Promise.reject(error)
})

// 添加响应拦截器
request.interceptors.response.use(
  function (response) {
  // 对响应数据做点什么
    return response.data
  },
  async function (error) {
  // 对响应错误做点什么
  // 处理token过期问题
    console.dir(error)
    if (error.response.status === 401) {
      const tokenInfo = store.state.user.token
      if (!tokenInfo.refresh_token) {
        // 没有刷新token
        // 清除token
        store.commit('user/removeToken')
        // 跳转到登录
        console.log(router)
        router.push({
          path: '/login',
          query: {
            back: router.currentRoute.fullPath
          }
        })
        // 给用户提示
        Toast.fail('登录信息过期')
        return
      }
      // 有刷新token
      try {
        const res = await axios({
          method: 'put',
          url: 'http://ttapi.research.itcast.cn/app/v1_0/authorizations',
          headers: {
            Authorization: 'Bearer ' + tokenInfo.refresh_token
          }
        })
        // 把新token存储到本地
        // console.log('res', res)
        // 更新token到vuex中
        store.commit('user/setToken', {
          token: res.data.data.token,
          refresh_token: tokenInfo.refresh_token
        })
        // 重新发送请求
        return request(error.config)
      } catch (err) {
        store.commit('user/removeToken')
        // 跳转到登录
        console.log(router)
        router.push({
          path: '/login',
          query: {
            back: router.currentRoute.fullPath
          }
        })
        // 给用户提示
        Toast.fail('登录信息过期')
      }
    } else {
      return Promise.reject(error)
    }
  })

export default request
